﻿using System.Collections;

namespace DelegateT1
{
    //? 一个代理类型
    public delegate void MemoHandler(int x, int y, IDictionary<string, int> data);

    public class OverloadableDelegateInvoker
    {
        private MemoHandler handler;

        public OverloadableDelegateInvoker()
        {
            //? 这个地方比java灵活，没有纠结是哪个interface，也没有纠结一个类是否需要实现这个interface，只要符合这个Delegate就可以用。
            //? 当然，灵活的同时也带来了不可控。因为你不知道这个类会被哪个Delegate用到，Delegate这个类型没显示的声明在类上。
            Type type = typeof(MemoHandler);
            Delegate d = Delegate.CreateDelegate(type, new C1(), "A");
            d = Delegate.Combine(d, Delegate.CreateDelegate(type, new C2(), "S"));
            d = Delegate.Combine(d, Delegate.CreateDelegate(type, new C3(), "M"));
            handler = (MemoHandler)d;
        }

        public void Memo(int x, int y, IDictionary<string, int> data)
        {
            {
                handler(x, y, data);
            }
        }
    }
}